Typ budowania CMAKE nie jest używany w Cmakelistach.txt

Mam problem z ustawieniem domyślnej konfiguracji kompilacji Na Release. W moich Cmakelistach.plik txt, ustawiłem CMAKE_BUILD_TYPE na górze pliku z:

#enable Release ALWAYS, configure vars
set(CMAKE_BUILD_TYPE Release)
set(EXECUTABLE_NAME "ParticleSimulator")
set(VERSION_MAJOR 0)
set(VERSION_MINOR 2)

Ale po zbudowaniu mojego projektu i otwarciu rozwiązania, zawsze jestem przedstawiony z trybem debugowania, w przeciwieństwie do tego, co określiłem w moim pliku CMakeLists. Co robię źle?

Spojrzałem na kilka innych pytań na tam, ale nie widziałem nic, co było specyficzne dla tego pytania.

A gist of the CMakeLists.txt .

Author: Peter Mortensen, 2014-06-27

3 answers

Istnieją dwa typy generatorów: jedno-i wielo-konfiguracyjne.

Pojedyncze konfiguracje

Generatory Makeopodobne: Unixowe pliki Makefile, NMAKE Makefiles, MinGW Makefiles ,...

Ustawiasz typ konfiguracji w kroku generowania:

cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"

W tym przypadku etap budowania to zawsze debugowanie :

> cmake --build _builds/Debug
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Debug # `--config` ignored
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Release # yep, ignored
/usr/bin/c++ -g ...

Multi-configuration

Generatory IDE: Visual Studio, Xcode

CMAKE_BUILD_TYPE przy generowaniu krok jest ignorowany, zarówno:

> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Debug "-GVisual Studio 12 2013 Win64"

I

> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Release "-GVisual Studio 12 2013 Win64"

Będzie miał ten sam efekt:

Tutaj wpisz opis obrazka

Dzieje się tak dlatego, że wszystkie konfiguracje są wewnętrzne (np. _builds/msvc-opaque/Release i _builds/msvc-opaque/Debug czy coś takiego, nie ma znaczenia). Możesz użyć opcji --config do przełączania:

> cmake --build _builds --config Release
cl /O2 ...
> cmake --build _builds --config Debug
cl /Od ...

Kontrola (?)

Tak, możesz. Po prostu zdefiniuj CMAKE_CONFIGURATION_TYPES :
# Somewhere in CMakeLists.txt
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")

Default wyjście:

-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo
-- Configuring done

Przepisz to:

> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;Release" "-GVisual Studio 12 2013 Win64"
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release
-- Configuring done

Tutaj wpisz opis obrazka

Możesz nawet zdefiniować własny typ konfiguracji:

> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;MyRelease" -DCMAKE_CXX_FLAGS_MYRELEASE="/My-Rel-flag" -DCMAKE_EXE_LINKER_FLAGS_MYRELEASE="/My-Linker-flags" "-GVisual Studio 12 2013 Win64"

Tutaj wpisz opis obrazka

I zbudować:

Cmake --build _builds --config MyRelease

Bałagan (?)

Wcale nie, jeśli znasz sztuczkę :) oto jak zbudować / przetestować konfigurację w skrypcie / serwerze CI / instrukcjach budowania dokumentacji itp.:

> CONFIG=Debug
> cmake -H. -B_builds "-DCMAKE_BUILD_TYPE=${CONFIG}" # Set Debug to Makefile, ignored by IDE
> cmake --build _builds --config "${CONFIG}" # Build Debug in IDE, ignored by Makefile
> (cd _builds && ctest -VV -C "${CONFIG}") # Test Debug in IDE, ignored by Makefile

Zły wzór

if(CMAKE_BUILD_TYPE STREQUAL Debug) # Burn it with fire!!!
set(CMAKE_BUILD_TYPE MySuperRelease) # Be ready to catch a bug from IDE user...

Dobrze one

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --my-debug-flags")
Działa nieźle.
target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>")

Dziękuję! :) Oszczędzasz dzień dla jednego programisty.

Działa dla mnie z Makefile, jestem szczęśliwy ...

Jakiś cytat z fajnej książki miłego faceta pewnie wiesz (podkreślenie moje):

Po co się kłopotać? Osób, które programują na różnych systemach lub używają wiele kompilatorów dba o to, bo jeśli nie, to są zmuszeni marnować czas znajdowanie i naprawianie niejasnych robaki. Ludzie, którzy twierdzą, że nie dbają o przenośność zazwyczaj tak robią, ponieważ używają tylko jednego systemu i czują, że może sobie pozwolić na postawę, że " język jest tym, co implementuje mój kompilator.’’ To jest wąski i krótkowzroczny widok. Jeśli twój program się powiedzie, to jest prawdopodobnie zostanie przeniesiony, więc ktoś będzie musiał znaleźć i naprawić problemy związane z funkcje zależne od implementacji. Ponadto programy często muszą być skompilowane z innymi kompilatorami dla tego samego systemu, a nawet przyszłe wydanie Twój ulubiony kompilator może robić pewne rzeczy inaczej niż obecny. Informatyka jest znacznie łatwiejsze do poznania i ograniczenia wpływu zależności implementacyjnych, gdy program jest napisany, a nie po to, by potem rozplątać bałagan.

 214
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-31 15:51:55

Możesz również użyć następującego fragmentu:

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
            "Default build type: RelWithDebInfo" FORCE)
endif()
 7
Author: adembudak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-13 21:31:49

Istnieje możliwość, że jeden z podmodułów ustawił wartość CMAKE_BUILD_TYPE w pamięci podręcznej, czyli:

SET(CMAKE_BUILD_TYPE Debug CACHE) 

Co oznacza, że ta wartość będzie stale aktualizowana od tego punktu do końca uruchomienia konfiguracji.

Świetnym sposobem na śledzenie miejsca, w którym ta wartość się zmieniła jest użycie CMake ' s variable_watch. W głównym pliku CMakelists.txt Dodaj następujący wiersz

variable_watch(CMAKE_BUILD_TYPE)

To wyświetli standardowy błąd przy każdym dostępie do tego zmienna. I aby dostać go do pliku dziennika, zrób coś w stylu:

cmake <your options> 2>variable_watch.log

Możesz zobaczyć coś w stylu:

CMake Debug Log at <...> / CMakeLists.txt: 184 (add_library): Zmienna "CMAKE_BUILD_TYPE" została uzyskana za pomocą READ_ACCESS z wartością "Debug".

Wtedy prawdopodobnie zobaczysz punkt(y), w którym CMAKE_BUILD_TYPE został po raz pierwszy zmieniony. A stąd będziesz znacznie bliżej namierzenia linii CMake.

 6
Author: Daniel Heilper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-31 15:53:31